﻿''' <summary>
''' Speichert die Informationen fuer die Kampagnen ab.
''' Was gewonnen,verloren und auswaehlbar sind....
''' </summary>
''' <remarks></remarks>
Public Class ObjektLandkartenInfos
    Implements ICloneable
    Const Version As Byte = 0
    Public HintergrundsBild As String
    ''' <summary>
    ''' Er sollte dann etwa so aussehen: *.kamp\
    ''' </summary>
    ''' <remarks></remarks>
    Public KampagnenOrdner As String

    Public Missionen As Mission() = {}
    Shared Komprimiert As Boolean
    ''' <summary>
    ''' Wird AUSSCHLIEssLICH zum Komprimieren benutzt.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Datei As String
    Public BlockierteEinheiten() As BlockierteEinheit = {}
    Public Spielmodus As CommanderWarsGameModi = DataSettings.CommanderWarsGameModus
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="Datei">Der komplette Dateipfad wird jetzt aus gelesen</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal Datei As String)
        Komprimiert = False
        ObjektLandkartenInfos.Datei = ""
        HintergrundsBild = ""
        Dim KampagneNames() As String = {}
        Dim strR As New IO.StreamReader(Datei, Hauptmenue.Codierung)
        While Not strR.EndOfStream
            Dim z As String = strR.ReadLine
            z = z.Trim
            If z.Contains("//") Then
                z = z.Remove(z.IndexOf("//"))
            End If
            z = z.Trim

            If z.ToLower = "komprimiert=1" Then
                Komprimiert = True
            End If
            If Not Komprimiert Then
                ObjektLandkartenInfos.Datei += Environment.NewLine + z  'Noch eine Aufzeichnung machen.
            End If


            If z.ToLower.StartsWith("hintergrund:") Then
                HintergrundsBild = z.Remove(0, z.IndexOf(":") + 1)
                Continue While
            End If

            If z.ToLower.StartsWith("mission|") Then
                Dim infos() As String = z.Split("|")
                If Komprimiert Then
                    NeueMission(infos(1), infos(2), infos(6), Color.FromArgb(255, CInt(infos(3)), CInt(infos(4)), CInt(infos(5))), infos(7), infos(8), infos(9), infos(10))
                Else
                    NeueMission(infos(1), infos(2), infos(6), Color.FromArgb(255, CInt(infos(3)), CInt(infos(4)), CInt(infos(5))))
                End If
            End If
            Dim Languages() As String = [Enum].GetNames(Sprachen.English.GetType)
            If z.ToLower.StartsWith(Languages(DataSettings.Sprache).ToLower + ":") Then
                KampagneNames = z.Remove(0, z.IndexOf(":") + 1).Split("|")
            End If

            'Wir wollen das man manche Einheiten nicht bauen kann.
            If z.ToLower.StartsWith("blockierteeinheit:") Then
                z = z.Remove(0, z.IndexOf(":") + 1)
                Dim infos() As String = z.Split("|")
                AddBlockierteEinheit(infos(0), infos(1))
            End If

            If z.ToLower.StartsWith("gamemode:") Then
                Spielmodus = z.Remove(0, z.IndexOf(":") + 1) - 1
                If Spielmodus >= 0 Then
                    If Spielmodus <> DataSettings.CommanderWarsGameModus Then
                        DataSettings.CommanderWarsGameModus = Spielmodus
                        Objektverwalter.LoadNewGameModus(DataSettings.TerrainStyle)
                    End If
                Else
                    Spielmodus = DataSettings.CommanderWarsGameModus
                End If
            End If
        End While
        strR.Dispose()
        If KampagneNames.Length > 0 Then
            For I = 0 To KampagneNames.Length - 1
                Missionen(I).Missionsname = KampagneNames(I)
            Next
        End If

        If Not Komprimiert Then
            'Na gut dann eben noch komprimiert abspeichern
            Try
                My.Computer.FileSystem.WriteAllText(Datei, "Komprimiert=1" + ObjektLandkartenInfos.Datei, False, Hauptmenue.Codierung)
            Catch
                Konsole.Write("Couldn't compress Camapaign file. Retry it.")
                My.Computer.FileSystem.WriteAllText(Datei + ".comp", "Komprimiert=1" + ObjektLandkartenInfos.Datei, False, Hauptmenue.Codierung)
            End Try
        End If
    End Sub
    ''' <summary>
    ''' Only use this function to create a Clear Class you must call Read afterwards!!!
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()
        Komprimiert = False
    End Sub
    Private Sub NeueMission(ByVal Bildname As String, ByVal Kartenname As String, ByVal Zustand As Integer, ByVal Siegfarbe As Color)
        Array.Resize(Missionen, Missionen.Length + 1)
        Missionen(Missionen.Length - 1) = New Mission(Kartenname, Zustand, Bildname, Siegfarbe)
    End Sub
    Private Sub NeueMission(ByVal Bildname As String, ByVal Kartenname As String, ByVal Zustand As Integer, ByVal Siegfarbe As Color, ByVal KooX As Integer, ByVal KooY As Integer, ByVal MitteX As Integer, ByVal MitteY As Integer)
        Array.Resize(Missionen, Missionen.Length + 1)
        Missionen(Missionen.Length - 1) = New Mission(Kartenname, Zustand, Bildname, Siegfarbe, KooX, KooY, MitteX, MitteY)
    End Sub

    Structure BlockierteEinheit
        Implements ICloneable
        Dim EinheitenID As String
        Dim Armee As String
        Public Sub New(ByVal EinheitenID As String, ByVal Armee As String)
            Me.EinheitenID = EinheitenID
            Me.Armee = Armee
        End Sub

        Public Sub Write(ByRef StrW As Filestream)
            WriteString(StrW, EinheitenID)
            WriteString(StrW, Armee)
        End Sub
        Public Sub Read(ByRef StrR As Filestream)
            EinheitenID = ReadString(StrR)
            Armee = ReadString(StrR)
        End Sub

        Public Function Clone() As Object Implements System.ICloneable.Clone
            Return MemberwiseClone()
        End Function
    End Structure
    Public Sub AddBlockierteEinheit(ByVal EinheitenID As String, ByVal Armee As String)
        For I = 0 To BlockierteEinheiten.Length - 1
            If BlockierteEinheiten(I).Armee = Armee And BlockierteEinheiten(I).EinheitenID = EinheitenID Then
                Exit Sub
            End If
        Next
        Array.Resize(BlockierteEinheiten, BlockierteEinheiten.Length + 1)
        BlockierteEinheiten(BlockierteEinheiten.Length - 1) = New BlockierteEinheit(EinheitenID, Armee)
    End Sub
    Public Sub RemoveBlockierteEinheit(ByVal EinheitenID As String, ByVal Armee As String)
        For I = 0 To BlockierteEinheiten.Length - 1
            If BlockierteEinheiten(I).Armee = Armee And BlockierteEinheiten(I).EinheitenID = EinheitenID Then
                BlockierteEinheiten(I) = BlockierteEinheiten(BlockierteEinheiten.Length - 1)
                Array.Resize(BlockierteEinheiten, BlockierteEinheiten.Length - 1)
                Exit For
            End If
        Next
    End Sub

    Public Sub Write(ByRef StrW As Filestream)
        StrW.WriteByte(Version)
        WriteString(StrW, HintergrundsBild)
        WriteString(StrW, KampagnenOrdner)
        StrW.WriteByte(Spielmodus)
        StrW.WriteByte(Komprimiert)
        For I = 0 To Missionen.Length - 1
            Missionen(I).Write(StrW)
        Next
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        For I = 0 To BlockierteEinheiten.Length - 1
            BlockierteEinheiten(I).Write(StrW)
        Next
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
    End Sub
    Public Sub Read(ByRef StrR As Filestream)
        Dim V As Byte = StrR.ReadByte
        HintergrundsBild = ReadString(StrR)
        KampagnenOrdner = ReadString(StrR)
        Spielmodus = StrR.ReadByte
        Komprimiert = StrR.ReadByte

        Dim Ende() As Byte = {0, 0, 0, 0}
        While Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254)
            Ende(0) = StrR.ReadByte
            Ende(1) = StrR.ReadByte
            Ende(2) = StrR.ReadByte
            Ende(3) = StrR.ReadByte
            StrR.Seek(-4)
            If Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254) Then
                Array.Resize(Missionen, Missionen.Length + 1)
                Missionen(Missionen.Length - 1) = New Mission("", Mission.MissionsZustaende.NichtAnwaehlbar, "", Color.Blue, 0, 0, 0, 0)
                Missionen(Missionen.Length - 1).Read(StrR, V)
            End If
        End While
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
        Ende = New Byte() {0, 0, 0, 0}
        While Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254)
            Ende(0) = StrR.ReadByte
            Ende(1) = StrR.ReadByte
            Ende(2) = StrR.ReadByte
            Ende(3) = StrR.ReadByte
            StrR.Seek(-4)
            If Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254) Then
                Array.Resize(BlockierteEinheiten, BlockierteEinheiten.Length + 1)
                BlockierteEinheiten(BlockierteEinheiten.Length - 1) = New BlockierteEinheit("", "")
                BlockierteEinheiten(BlockierteEinheiten.Length - 1).Read(StrR)
            End If
        End While
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
    End Sub

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim Klon As ObjektLandkartenInfos = MemberwiseClone()
        ReDim Klon.Missionen(Missionen.Length - 1)
        For I = 0 To Klon.Missionen.Length - 1
            Klon.Missionen(I) = Missionen(I).Clone
        Next
        ReDim Klon.BlockierteEinheiten(BlockierteEinheiten.Length - 1)
        For I = 0 To Klon.BlockierteEinheiten.Length - 1
            Klon.BlockierteEinheiten(I) = BlockierteEinheiten(I).Clone
        Next
        Return Klon
    End Function
End Class
Public Class Mission
    Implements ICloneable
    Enum MissionsZustaende
        NichtAnwaehlbar
        Anwaehlbar
        Ausgewaehlt
        Gewonnen
        Verloren
    End Enum
    Public Missionsname As String = ""
    Dim Bildname As String = ""
    Dim Siegfarbe As Color = Color.Lime
    Dim KooX, KooY, MitteX, MitteY As Integer
    Public MissionsZustand As MissionsZustaende = MissionsZustaende.NichtAnwaehlbar
    Public Sub New(ByVal Name As String, ByVal Zustand As MissionsZustaende, ByVal Bildname As String, ByVal Siegfarbe As Color)

        Missionsname = Name
        MissionsZustand = Zustand
        Me.Bildname = Bildname
        Me.Siegfarbe = Siegfarbe
        Dim BildOrg As Bitmap = Image.FromFile(DataSettings.Resourcenpfad + "Worldmap\" + Bildname + ".png")
        Dim Xr As Integer = -1 'Erstmal alles ungueltige Werte
        Dim Yu As Integer = -1
        KooX = -1
        KooY = -1
        For X = 0 To BildOrg.Width - 1
            For Y = 0 To BildOrg.Height - 1
                If Not BildOrg.GetPixel(X, Y).A = 0 Then
                    'Hier ist irgendetwas gemalt, wenn auch vielleicht nur schwach...
                    If KooX = -1 Then KooX = X 'kleinster X-Wert
                    If KooY = -1 Then KooY = Y 'kleinster Y-Wert
                    If KooY > Y Then KooY = Y
                    Xr = X 'bis jetzt der Wert der am weitesten Rechts ist!
                    If Yu < Y Then Yu = Y 'entsprechend mit Y.
                End If
            Next
        Next
        'Hoffentlich hat jetzt keiner der Werte den Wert -1!
        'Wenn das jetzt nicht allzulange gedauert hat, koennen wir noch weitermachen.
        MitteX = (KooX + Xr) / 2 'der gute alte Durchschnitt sorgt fuer den Mittelpunkt.
        MitteY = (KooY + Yu) / 2
        'Das Bild muss noch ausgeschnitten werden.
        Dim BildNeu As New Bitmap(Xr - KooX + 1, Yu - KooY + 1) 'Das ist die Richtige Groesse
        For X = 0 To BildNeu.Width - 1 'uuuuuuuuuund abmalen, viel spass, ich schau in ner Stunde wieder vorbei!
            For Y = 0 To BildNeu.Height - 1
                BildNeu.SetPixel(X, Y, BildOrg.GetPixel(KooX + X, KooY + Y))
            Next
        Next
        'Die Arbeit moechte ich nicht nochmal machen...
        BildNeu.Save(DataSettings.Resourcenpfad + "Worldmap\Komprimiert\" + Bildname + ".png")



        ' S C H A T T E N :
        BildNeu = New Bitmap(Xr - KooX + 1, Yu - KooY + 1) 'Das ist die Richtige Groesse
        BildOrg = Image.FromFile(DataSettings.Resourcenpfad + "Worldmap\" + Bildname + "_Schatten.png")
        For X = 0 To BildNeu.Width - 1 'uuuuuuuuuund abmalen, viel spass, ich schau in ner Stunde wieder vorbei!
            For Y = 0 To BildNeu.Height - 1
                BildNeu.SetPixel(X, Y, BildOrg.GetPixel(KooX + X, KooY + Y))
            Next
        Next
        'Die Arbeit moechte ich nicht nochmal machen...
        BildNeu.Save(DataSettings.Resourcenpfad + "Worldmap\Komprimiert\" + Bildname + "_Schatten.png")


        ObjektLandkartenInfos.Datei += "|" + KooX.ToString + "|" + KooY.ToString + "|" + MitteX.ToString + "|" + MitteY.ToString
    End Sub
    Public Sub New(ByVal Name As String, ByVal Zustand As MissionsZustaende, ByVal Bildname As String, ByVal Siegfarbe As Color, ByVal KooX As Integer, ByVal KooY As Integer, ByVal MitteX As Integer, ByVal MitteY As Integer)
        Missionsname = Name
        MissionsZustand = Zustand
        Me.Bildname = Bildname
        Me.Siegfarbe = Siegfarbe
        Me.KooX = KooX
        Me.KooY = KooY
        Me.MitteX = MitteX
        Me.MitteY = MitteY
    End Sub

    Public Function isAuswaehlbar() As Boolean
        If MissionsZustand = MissionsZustaende.Anwaehlbar Then Return True
        If MissionsZustand = MissionsZustaende.Ausgewaehlt Then Return True
        Return False
    End Function


    Public Function getBildname(Optional ByVal Schatten As Boolean = False) As String
        If Schatten Then
            Return Bildname + "_Schatten"
        Else
            Return Bildname
        End If
    End Function
    Public Function getIntColor(Optional ByVal Schatten As Boolean = False) As Color
        If Schatten Then
            Return Color.FromArgb(255, 255, 255, 255) 'Schatten werden generell ohne verfaerbungen gemalt.
        Else
            Select Case MissionsZustand
                Case MissionsZustaende.NichtAnwaehlbar, MissionsZustaende.Verloren 'Grau darstellen...
                    Return Color.FromArgb(255, 200, 200, 200)
                Case MissionsZustaende.Gewonnen 'In der jeweiligen Farbe darstellen.
                    Return Siegfarbe
                Case Else 'Andernfalls normal malen.
                    Return Color.FromArgb(255, 255, 255, 255)
            End Select
        End If
    End Function
    Public Function getBildKooX(Optional ByVal Mitte As Boolean = False) As Integer
        If Mitte Then
            Return MitteX
        Else
            Return KooX
        End If
    End Function
    Public Function getBildKooY(Optional ByVal Mitte As Boolean = False) As Integer
        If Mitte Then
            Return MitteY
        Else
            Return KooY
        End If
    End Function

    Public Sub ZustandGewonnen()
        MissionsZustand = MissionsZustaende.Gewonnen
    End Sub
    Public Sub ZustandAuswaehlbar()
        MissionsZustand = MissionsZustaende.Anwaehlbar
    End Sub

    Public Sub Write(ByRef StrW As Filestream)
        Dim B(3) As Byte
        WriteString(StrW, Missionsname)
        WriteString(StrW, Bildname)
        StrW.WriteByte(MissionsZustand)
        B = ColorToByte(Siegfarbe)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
        B = IntToBytes(KooX)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
        B = IntToBytes(KooY)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
        B = IntToBytes(MitteX)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
        B = IntToBytes(MitteY)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
    End Sub
    Public Sub Read(ByRef StrR As Filestream, ByVal Version As Byte)
        Dim B(3) As Byte
        Missionsname = ReadString(StrR)
        Bildname = ReadString(StrR)
        MissionsZustand = StrR.ReadByte

        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        Siegfarbe = BytesToColor(B)
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        KooX = BytesToInt(B)
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        KooY = BytesToInt(B)
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        MitteX = BytesToInt(B)
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        MitteY = BytesToInt(B)
    End Sub

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Return MemberwiseClone()
    End Function
End Class